package com.wgy.day39.反射.Class对象功能;



import com.wgy.day39.domain.Person;

import java.lang.reflect.Method;

/**
 * Created by pc on 2020/12/15 21:53
 * Description: LearningJava
 */
/*
*Class对象功能:之获取功能

3.获取成员方法们(Method)
   Method[] getMethods():获取所有public修饰的成员方法 (本类的和继承的父类(父接口)的成员方法)
   Method[] getMethod(String name,类<?>...parameterTypes):获取指定名称的public修饰的成员方法
   Method[] getDeclaredMethods():获取所有的成员方法,不考虑修饰符
   Method[] getDeclaredMethods(String name,类<?>...parameterTypes):获取指定名称的成员方法,不考虑修饰符

* 获取到的Method后的操作:(方法对象)
                        执行方法:Object invoke(Object obj,Object...args)
                     获取方法的名:String getName():获取方法名
4.获取类名
   String getName():

*/

public class Demo04Reflect_Method {
    public static void main(String[] args) throws Exception {
        //1.获取Person类的Class对象
        Class  personClass = Person.class;
        //2.通过Class对象获取指定名称的成员方法(无参数)
        Method eatMethod = personClass.getMethod("eat");
        //3.执行方法
        Person p=new Person();
        eatMethod.invoke(p);//吃饭

        //通过Class对象获取指定名称的成员方法(有参数的)
        Method eatMethod2 = personClass.getMethod("eat", String.class);
        //执行带参成员方法
        eatMethod2.invoke(p,"水果");//吃水果
        System.out.println("==========");

        //Method[] getMethods():获取所有public修饰的成员方法 (本类的和继承的父类(父接口)的成员方法)
        Method[] methods = personClass.getMethods();
        for (Method method : methods) {
            //获取方法对象
            System.out.println(method);
           // method.setAccessible(true);//暴力反射

            //获取方法名称
            String name = method.getName();
            System.out.println(name);
        }
        System.out.println("=============");

        //获取类名
        String className= personClass.getName();
        System.out.println(className);//com.wgy.day39.domain.Person


    }
}
